'''

SK 允许在 Prompt 模板中直接调用一个函数
'''
import asyncio
import os
import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
from semantic_kernel.functions import KernelArguments
from semantic_kernel.prompt_template import PromptTemplateConfig, InputVariable

translate_prompt = """
将中文词'{{$chinese}}'翻译为日语
直接给出一个翻译结果，不要评论。
尽可能用Hanji表示。
"""

# 在joke_prompt中可直接调用kernel的函数
joke_prompt = """
'{{$input}}'的日语是：{{MyDemoPlugin.translate $input}}
根据以上词汇在中日文中的语义差异，讲一个笑话。
"""

# 加载 .env 到环境变量
from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())

# 创建 semantic kernel
kernel = sk.Kernel()

# 配置 OpenAI 服务。OPENAI_BASE_URL 会被自动加载生效
api_key = os.getenv('OPENAI_API_KEY')
service_id = "default"

# 将 LLM 服务添加到 kernel 中
kernel.add_service(
    OpenAIChatCompletion(
        service_id=service_id,
        ai_model_id="gpt-3.5-turbo-1106",
        api_key=api_key
    ),
)
# 获取当前默认设定
req_settings = kernel.get_service(service_id).get_prompt_execution_settings_class()(service_id=service_id)

trans_prompt_template_config = PromptTemplateConfig(
    template=translate_prompt,
    description="Translate Chinese to Japanese",
    execution_settings={service_id: req_settings},
    input_variables=[
        InputVariable(name="chinese", description="The source", is_required=True),
    ],
)

joke_prompt_template_config = PromptTemplateConfig(
    template=joke_prompt,
    description="Generate a joke about a specific topic",
    execution_settings={service_id: req_settings},
    input_variables=[
        InputVariable(name="input", description="The topic", is_required=True),
    ],
)

translate_function = kernel.add_function(
    function_name="translate",
    plugin_name="MyDemoPlugin",
    prompt_template_config=trans_prompt_template_config,
)

joke_function = kernel.add_function(
    function_name="joke",
    plugin_name="MyDemoPlugin",
    prompt_template_config=joke_prompt_template_config,
)


async def runAsyncFunc(*args):
    return await kernel.invoke(*args)


result = asyncio.run(
    runAsyncFunc(
        joke_function,
        KernelArguments(input="电视机")

    )
)
print(result)
